﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 只允许一个示例
{
    class Program
    {


        /**
         * Mutex的作用和lock相似，不过与lock不同的是：Mutex可以跨进程实施线程锁。
         * Mutex有2个重要的静态方法：
        ○ WaitOne：阻止当前线程，如果收到当前实例的信号，则为true，否则为false
        ○ ReleaseMutex：用来释放锁，只有获取锁的线程才可以使用该方法，与lock一样
        Mutex一个经典应用就是：同一时间只能允许一个实例出现。
         * 
         * **/

        static Mutex mutex = new Mutex(true, "darren.mutex");

        static void Main(string[] args)
        {
            if (!mutex.WaitOne(2000))  //如果有互斥体，则有另一个实例在运行
            {
                Console.WriteLine("已经有另外一个示例在运行了");
                Console.ReadLine();
            }
            else
            {
                try
                {
                    RunAnother();
                }
                catch (Exception)
                {

                    throw;
                }
                finally {
                    mutex.ReleaseMutex();
                }
            }
        }
        static void RunAnother()
        {
            Console.WriteLine("我是模拟另外一个实例正在运行着~~不过可以按回车键退出");
            Console.ReadLine();
        }


    }
}
